package com.dura.strategy.filter.impl;

import com.dura.common.constant.CacheConstant;
import com.dura.common.constant.RabbitMQConstants;
import com.dura.common.model.StandardSubmit;
import com.dura.common.util.OperatorUtil;
import com.dura.strategy.client.BeaconCacheClient;
import com.dura.strategy.filter.StrategyFilter;
import com.dura.strategy.util.MobileOperatorUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @version 1.0
 * @Author 振鹏
 * @Date 2025/3/16 14:31
 * @注释
 */
@Service(value = "phase")
@Slf4j
public class PhaseStrategyFilter implements StrategyFilter {

    /**
     * 切分手机号 前7位
     */
    private final int MOBILE_START=0;
    private final int MOBILE_END=7;

    @Autowired
    private BeaconCacheClient cacheClient;



    @Autowired
    private MobileOperatorUtil mobileOperatorUtil;

    @Autowired
    private RabbitTemplate rabbitTemplate;

    private final String SEPARATE = ",";

    /**
     * 校验的长度
     */
    private final int LENGTH = 2;
    /**
     * 未知的情况
     */
    private final String UNKNOWN = "未知 未知,未知";

    /**
     * 号段补全的策略
     * 目的：查询对应的区域以及运营商信息  根据前7位，可以查到数据
     * 缓存查询
     * 网络查询
     * 如果是网络查询的，说明数据库缺少这部分呢数据，需要将信息同步到MYSQL 和redis中
     *
     * @param submit 对象
     */
    @Override
    public void strategy(StandardSubmit submit) {
        log.info("【策略模块-断号校验】 校验ing................");

        // 1. 根据手机号前七位，查询手机号信息
        String mobile=submit.getMobile().substring(MOBILE_START,MOBILE_END);

        // 2. 通过缓存查询对应的数据
        String mobileInfo = cacheClient.getString(CacheConstant.PHASE + mobile);

        getMobileInfo:
        if(StringUtils.isEmpty(mobileInfo) ){
            // 没有查询到，通过第三方查询
            mobileInfo = mobileOperatorUtil.getMobileInfoBy360(mobile);
            if(!StringUtils.isEmpty(mobileInfo)){
                //3、调用三方查到信息后，发送消息到MQ，并且同步到MySQL和Redis
                rabbitTemplate.convertAndSend(RabbitMQConstants.MOBILE_AREA_OPERATOR,submit.getMobile());
                break getMobileInfo;
            }
            mobileInfo = UNKNOWN;
        }

        // 4. 一定查询到了数据。
        String[] areaAndOperator = mobileInfo.split(SEPARATE);
        if(areaAndOperator.length==LENGTH){
                submit.setArea(areaAndOperator[0]);
                submit.setOperatorId(OperatorUtil.getOperatorIdByOperatorName(areaAndOperator[1]));
        }
    }
}
